/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#pragma once

#include "节点数据声明.h"

#include "MBT_Engine.h"
#include <file_文件名数据.h>
#include <材质/预设材质.h>



typedef struct {
	//void
}S_线程项;


typedef enum : uint8 {
	e_网格编辑_无,
	e_网格编辑_顶点,
	e_网格编辑_权重,
	e_网格编辑_纹理,
}E_网格编辑模式;







API_EXPORT void	f_NodeCtx_状态属性初始化();
API_EXPORT void	f_NodeCtx_状态属性释放();
API_EXPORT void	f_NodeCtx_清除状态属性数据();



//API_EXPORT void	f_NodeCtx_set场景根物体(S_设备环境& ctx);
API_EXPORT void	f_NodeCtx_初始化物体材质(S_设备环境& ctx);
API_EXPORT void	f_NodeCtx_释放物体材质();

API_EXPORT void	f_NodeCtx_初始化物体公用网格(S_设备环境& ctx);
API_EXPORT void	f_NodeCtx_释放物体公用网格();

//void	f_NodeCtx_set帧(S_时间帧& 帧);
API_EXPORT void	f_NodeCtx_set当前帧(int64 帧, float32 子帧 = 0);
API_EXPORT void	f_NodeCtx_set帧区间(ivec2 区间);



//API_EXPORT S_物体*		f_NodeCtx_get当前独立显示物体();
//API_EXPORT S_物体*		f_NodeCtx_get场景根物体();
API_EXPORT S_时间帧&	f_NodeCtx_get帧();
API_EXPORT void		f_NodeCtx_set场景当前时间(int32 t);


//void					f_NodeCtx_set焦点物体(std::vector<S_物体*>& objs, bool 添加);
//std::vector<S_物体*>&	f_NodeCtx_get焦点物体();
//void					f_NodeCtx_clear焦点物体();

//API_EXPORT void					f_NodeCtx_set选中物体(std::set<S_物体*>& objs, bool 添加);
API_EXPORT void					f_NodeCtx_set选中物体(const std::vector<S_物体*>& objs, bool 添加);
API_EXPORT void					f_NodeCtx_clear选中物体();

API_EXPORT void					f_NodeCtx_set选中编辑物体(S_物体* ob, int32 元素, bool 添加);
API_EXPORT void					f_NodeCtx_clear选中编辑物体();

API_EXPORT void					f_NodeCtx_set选中辅助编辑物体(S_物体* ob, int32 元素, bool 添加);
API_EXPORT void					f_NodeCtx_clear选中辅助编辑物体();


API_EXPORT S_物体*					f_NodeCtx_get骨骼骨架对象(S_物体* 骨骼);



//std::vector<C_Widget*>&	f_NodeCtx_get焦点节点(std::vector<S_物体*>& objs);
API_EXPORT void f_NodeCtx_录物体类节点(class C_节点基类* 节点);
API_EXPORT void f_NodeCtx_录物体类节点(class C_节点基类* 节点, S_物体* ob);
API_EXPORT void f_NodeCtx_清除物体类节点(S_物体* ob);
API_EXPORT std::vector<class C_节点基类*> f_NodeCtx_从可视物体取节点(const std::vector<S_物体*>& obs);
API_EXPORT std::vector<class C_节点基类*> f_NodeCtx_从可视物体取节点(const std::set<S_物体*>& obs);

//void f_NodeCtx_记录操作物体类节点(class C_节点基类* 节点);
//void f_NodeCtx_清除操作物体类节点(C_节点基类* ob);
//void f_NodeCtx_物体保存操作记录(std::set<S_物体*>& obs);


API_EXPORT S_材质管线* f_NodeCtx_get单色点材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色线材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色面材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色平直面材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色描边材质();

API_EXPORT S_材质管线* f_NodeCtx_get基本光照线段材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本光照描边材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本光照线材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本光照面材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本光照点材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本平直面光照材质();
API_EXPORT S_材质管线* f_NodeCtx_get基本光照面轮廓材质();

API_EXPORT S_材质管线* f_NodeCtx_getAABB材质();

API_EXPORT S_材质管线* f_NodeCtx_get权重可视线材质();
API_EXPORT S_材质管线* f_NodeCtx_get权重可视面材质();
API_EXPORT S_材质管线* f_NodeCtx_get索引绘制_颜色线材质(bool 线段 = false);
API_EXPORT S_材质管线* f_NodeCtx_get索引绘制_颜色点材质();

API_EXPORT S_材质管线* f_NodeCtx_get图标材质();

API_EXPORT S_材质管线* f_NodeCtx_get逐顶点线段材质(bool 统一朝向 = false);
API_EXPORT S_材质管线* f_NodeCtx_get逐顶点连续线材质();
API_EXPORT S_材质管线* f_NodeCtx_get逐顶点点材质();

API_EXPORT S_材质管线* f_NodeCtx_get逐顶点曲线材质();
API_EXPORT S_材质管线* f_NodeCtx_get逐顶点曲线控制点材质();
API_EXPORT S_材质管线* f_NodeCtx_get逐顶点曲线控制线材质();

API_EXPORT S_材质管线* f_NodeCtx_get灯光模型中心圆材质(S_设备环境& ctx);
API_EXPORT S_材质管线* f_NodeCtx_get灯光模型范围线材质(S_设备环境& ctx);
API_EXPORT S_材质管线* f_NodeCtx_get灯光模型方向线材质(S_设备环境& ctx);
API_EXPORT S_材质管线* f_NodeCtx_get区域灯光模型点材质(S_设备环境& ctx);

API_EXPORT S_材质管线* f_NodeCtx_get单虚拟体材质(S_设备环境& ctx);

API_EXPORT S_材质管线* f_NodeCtx_get虚拟体中心圆材质(S_设备环境& ctx);
API_EXPORT S_材质管线* f_NodeCtx_get虚拟体范围线材质(S_设备环境& ctx);
API_EXPORT S_材质管线* f_NodeCtx_get虚拟体方向线材质(S_设备环境& ctx);

API_EXPORT S_材质管线* f_NodeCtx_get单元素虚拟体材质(S_设备环境& ctx);

API_EXPORT S_材质管线* f_NodeCtx_get线段描边材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色线段材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色连续线材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色连续虚线材质();
API_EXPORT S_材质管线* f_NodeCtx_get单色线段虚线材质();

API_EXPORT S_材质管线* f_NodeCtx_get数值标注材质();
API_EXPORT S_材质管线* f_NodeCtx_get数值标注线材质();
API_EXPORT S_材质管线* f_NodeCtx_get包围盒材质();

API_EXPORT S_材质管线* f_NodeCtx_getFLIP调试预览材质();

API_EXPORT S_材质管线* f_NodeCtx_get物理光照轮廓材质();
API_EXPORT S_材质管线* f_NodeCtx_get物理光照线材质();




API_EXPORT void f_NodeCtx_删除物体到回收站(S_物体* ob);
API_EXPORT S_物体* f_NodeCtx_回收物体();

API_EXPORT void f_NodeCtx_set物体全局显示模式(S_物体* ob, uint32 模式位域);
API_EXPORT void f_NodeCtx_物体显示模式(S_物体* ob, uint32 模式位域);
API_EXPORT void f_NodeCtx_物体全局显示模式(S_物体* ob, uint32 模式位域);
API_EXPORT void f_NodeCtx_物体线模式显示(S_物体* ob);
API_EXPORT void f_NodeCtx_物体面模式显示(S_物体* ob);
API_EXPORT void f_NodeCtx_物体线面模式显示(S_物体* ob);

API_EXPORT void f_NodeCtx_set物体全局显示模式(uint32 模式位域);
API_EXPORT void f_NodeCtx_set物体全局渲染模式(uint32 物体显示模式, E_物体渲染模式 模式);



struct S_节点UI主题 {
	API_EXPORT static S_RGBA8UI uic_I8;
	API_EXPORT static S_RGBA8UI uic_UI8;
	API_EXPORT static S_RGBA8UI uic_I16;
	API_EXPORT static S_RGBA8UI uic_UI16;
	API_EXPORT static S_RGBA8UI uic_I32;
	API_EXPORT static S_RGBA8UI uic_UI32;
	API_EXPORT static S_RGBA8UI uic_I64;
	API_EXPORT static S_RGBA8UI uic_UI64;
	API_EXPORT static S_RGBA8UI uic_F32;
	API_EXPORT static S_RGBA8UI uic_vec2;
	API_EXPORT static S_RGBA8UI uic_vec3;
	API_EXPORT static S_RGBA8UI uic_vec4;
	API_EXPORT static S_RGBA8UI uic_mat2X2;
	API_EXPORT static S_RGBA8UI uic_mat3X2;
	API_EXPORT static S_RGBA8UI uic_mat4X2;
	API_EXPORT static S_RGBA8UI uic_mat2X3;
	API_EXPORT static S_RGBA8UI uic_mat3X3;
	API_EXPORT static S_RGBA8UI uic_mat4X3;
	API_EXPORT static S_RGBA8UI uic_mat4X4;

	API_EXPORT static S_RGBA8UI uic_模型面;
	API_EXPORT static S_RGBA8UI uic_模型线;
	API_EXPORT static S_RGBA8UI uic_模型点;
	API_EXPORT static S_RGBA8UI uic_模型焦点;
	API_EXPORT static S_RGBA8UI uic_空间曲线;
	API_EXPORT static S_RGBA8UI uic_摄像机虚拟体;

	API_EXPORT static S_RGBA8UI uic_对象;
	API_EXPORT static S_RGBA8UI uic_物体;
	API_EXPORT static S_RGBA8UI uic_解算器;
	API_EXPORT static S_RGBA8UI uic_链接线;
	API_EXPORT static S_RGBA8UI uic_链接线链接;
	API_EXPORT static S_RGBA8UI uic_主线辅线;
	API_EXPORT static S_RGBA8UI uic_网格辅线;
	API_EXPORT static S_RGBA8UI uic_刻度线L1;
	API_EXPORT static S_RGBA8UI uic_刻度线L2;

	API_EXPORT static S_RGBA8UI uic_骨骼面物体状态;
	API_EXPORT static S_RGBA8UI uic_骨骼边物体状态;
	API_EXPORT static S_RGBA8UI uic_骨骼面编辑状态;
	API_EXPORT static S_RGBA8UI uic_骨骼边编辑状态;
	API_EXPORT static S_RGBA8UI uic_骨骼编辑焦点;
	API_EXPORT static S_RGBA8UI uic_骨节编辑焦点;

	API_EXPORT static std::string	ui_默认字体;
	API_EXPORT static std::string	ui_节点图标;

	S_节点UI主题();

};


API_EXPORT void f_update轮廓着色器参数配置(S_材质管线* mat, S_物体* ob, S_Mesh* me, uint8 元素, uint32 多维子元素);




